home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / telecomm / bbs / defuser3.lha / Defuser.rexx < prev   
Encoding:
OS/2 REXX Batch file  |  1994-12-01  |  4.8 KB  |  176 lines

  1. /* 
  2. Mat's Mail Bomb Defuser V3.11   For CHRIST'S SAKE: ** Read doc file! ** 
  3. By Mat Bettinson FiDO 2:254/205 E-Mail mat@darkside.demon.co.uk
  4. Now incorporating Trap Prong TM.
  5. 2.5. URGENT RE-WRITE! Some systems rename packets depending on the BBS
  6. software. The system worked with Xenolink but not others.
  7. THIS ONLY APPLIES TO TRAP PRONG bogus archive detection.
  8. 3.0. LHA packet RESUME damage GREATLY expanded as different LHA settings
  9. would defeat the simplistic (but fast) routine in 2.5. Now this will do the
  10. job PROPERLY at the expense of speed. Those wishing to just use Mail bomb
  11. protection can now set the TP flag to 0 as below.
  12. 3.1 LHA checking expanded for even more bizaar archives.
  13.  
  14. ** Once again the 'London Xenolink Alliance' saves your butt. :-) **
  15.  
  16. If you AREN'T running Xenolink then you MUST CHANGE BBSTEMP below!
  17. it must be what your system renames MAIL packets to before unarching or
  18. it MUST be a null string as below.
  19. TP = 1 means to check for RESUME DAMAGE. NEW! Instead of VERBOSE on the
  20. command line they are LHA options and will be parsed to LHA. For instance: 
  21. rx Defuser %s -b100
  22. Will parse -b100 to LHA. 
  23. */
  24. EXEdir = 'C:'
  25. MaxSize = 100000
  26. MaxArc = 5000000
  27. Logfile = 'MAIL:Defuser.log'
  28. BadPKT = 'XIN:BAD/'
  29. LHAOpt = 'x -q'
  30. BBSTemp = ''
  31. CheckResume = 'YES'
  32.  
  33. /* If you don't know what you're doing I don't recommend pissing about with
  34. it from here on in as it works right now. The slightest mistake will lose
  35. you mail packets. */
  36.  
  37. Arg file specLHA
  38. Dateline = Date('E')
  39. Dateline = TIME('N')' 'Dateline
  40. IF file = '' THEN EXIT 10
  41. specLHA =  strip(specLHA)
  42. file = strip(file)
  43. IF EXISTS(logfile) THEN CALL OPEN(log,logfile,"A")
  44. ELSE CALL OPEN(log,logfile,"W")
  45. IF ~ exists(file) THEN DO
  46.  CALL WRITELN(log,Dateline' 'file' not found.')
  47.  CALL WRITELN(log,'---')
  48.  CALL CLOSE(log)
  49.  EXIT 10
  50.  END
  51. address COMMAND
  52. EXEdir'LHA >T:Defuse.temp l "'file'"'
  53. CALL OPEN(check,'T:Defuse.temp','R')
  54. total = 0
  55. Error = 0
  56. CALL WRITELN(log,Dateline' Defuser session started:')
  57. DO until EOF(check)
  58.  line = READLN(check)
  59.  parse VAR line dat1 dat2 dat3 dat4 dat5 dat6
  60.  IF right(strip(dat6),5) = 'files' THEN break
  61.  IF right(strip(dat3),1) = '%' THEN DO
  62.    filename = strip(dat6)
  63.    filesize = strip(dat1)
  64.    IF Filesize > maxsize THEN CALL ErrorSize
  65.    IF upper(right(filename,4)) ~= '.PKT' THEN CALL ErrorName
  66.    END
  67.  END
  68. CALL CLOSE(check)
  69. Tfiles = strip(word(dat6,1))
  70. Total = strip(dat1)
  71. ArcSz = strip(dat2)
  72. Numfiles = word(dat6,1)
  73. If CheckResume = 'YES' then Call CheckTPDamage
  74. EXEdir'Delete >NIL: t:Defuse.temp'
  75. IF total > maxarc THEN DO
  76.  CALL WRITELN(log,' PKT *FAILED!* Archive total is 'total' which exceeds 'maxarc)
  77.  Error = 1
  78.  END
  79. IF Error = 0 THEN DO
  80.  CALL WRITELN(log,' LHA session OK. Total uncomp size: 'total)
  81.  CALL WRITELN(log,'---')
  82.  CALL CLOSE(log)
  83.  EXEdir'LHA 'LHAOpt' 'SpecLHA' "'file'" #?.PKT'
  84.  EXIT
  85.  END
  86. CALL WRITELN(log,'Packet rejected. CALL the BOMB SQUAD!')
  87. CALL WRITELN(log,'Suspect moved to 'BadPKT' ... Phew!')
  88. CALL WRITELN(log,'---')
  89. CALL CLOSE(log)
  90. EXEdir'Copy >NIL: "'file'" to "'BadPKT'"'
  91. EXEdir'Delete >NIL: "'file'"'
  92. EXIT 10
  93. ErrorSize:
  94. CALL WRITELN(log,' PKT *FAILED!* File in archive larger than 'maxsize)
  95. Error = 1
  96. RETURN
  97. ErrorName:
  98. CALL WRITELN(log,' PKT *FAILED!* 'filename' not a valid PKT name!')
  99. Error = 1
  100. RETURN
  101. TrapdoorBlues:
  102. CALL WRITELN(log,' PKT *FAILED!* File longer than archive!')
  103. CALL GetNewName
  104. CALL OPEN('new',newfile,'W')
  105. CALL OPEN('sus',file,'R')
  106. CALL SEEK('sus',Reallength,'B')
  107. DO until EOF('sus')
  108.  Buf = READCH('sus',256)
  109.  CALL WRITECH('new',Buf)
  110.  END
  111. CALL CLOSE('sus')
  112. CALL CLOSE('new')
  113. RETURN
  114. GetNewName:
  115. D = d2x(date('S'))
  116. S = d2x(time('S'))
  117. stamp = right(d||S,8)'.'upper(left(strip(date('W')),2))
  118. asc = 47
  119. DO forever
  120.  asc = asc + 1
  121.  x = D2C(asc)
  122.  IF ~ EXISTS(fdir||stamp||x) THEN break
  123.  END
  124. newfile = fdir||stamp||x
  125. CALL WRITELN(log,'**     Trap Prong ACTIVATED!     **')
  126. CALL WRITELN(log,' Writing 'Diff' bytes remainder to 'newfile)
  127. CALL WRITELN(log,'** Trap Prong session completed. **')
  128. RETURN
  129.  
  130. CheckTPDamage:
  131. temp = translate(file,"  ",":/")
  132. fname = strip(word(temp,words(temp)))
  133. fdir = left(file,length(file)-Length(fname))
  134. IF fname = BBSTemp | BBSTemp = '' THEN DO
  135.  CALL CheckProng
  136.  If bogus = 1 then CALL TrapDoorBlues
  137.  END
  138. RETURN
  139.  
  140. CheckProng:
  141. Call open(test,file,"R")
  142. CALL WRITELN(log,'Archive checked for Resume Damage.')
  143. Block = 0
  144. Count = 0
  145. Lenf.0 = 0
  146. OldPos = 0
  147. Call Seek(test,0,'B')
  148. Do until EOF(test)
  149.  Call Seek(test,Block,'B')
  150.  Buff = READCH(test,520)
  151.  chk = INDEX(buff,'-lh')
  152.  IF chk ~= 0 then DO
  153.   subind = 1
  154.   Do forever
  155.    chk = INDEX(Buff,'-lh',subind)
  156.    If chk < 8 & Block ~= 0 then break
  157.    If chk = 0 then break
  158.    count = count + 1
  159.    temp = Block + chk + subind
  160.    IF count = (Tfiles + 1) then bang = temp
  161.    Lenf.Count = temp - oldpos
  162.    Oldpos = temp
  163.    Subind = chk + 1
  164.    END
  165.   END
  166.  Block = Block + 512
  167.  END
  168. IF Count ~= Tfiles then DO
  169.  RealLength = bang - 3
  170.  Diff = len - RealLength
  171.  bogus = 1
  172.  END
  173. ELSE bogus = 0
  174. Call Close(test)
  175. RETURN
  176.